<?php
	header("content-type:text/html;charset=utf-8");
	//tp的控制器调度原理
	class IndexAction{
		public function index(){
				echo 'index <br>';
		}
		public function test($year = 2016, $month = 10, $day = 10){
				echo $year.'--------'.$month.'-----------'.$day.'<br>';
		}
		public function _before_index(){
				echo __FUNCTION__.'<br>';
		}
		public function _after_index(){
				echo __FUNCTION__.'<br>';
		}
	}	


	//首先判断  index有没有，并且是public
	//ReflectionClass 对象
	$class = new ReflectionClass('IndexAction');

	//先判断index方法，有没有
	if($class->hasMethod('index')){
		
		$index_method = $class->getMethod('index');
	//	echo '<pre>';
	//	var_dump($index_method);
		if($index_method->isPublic()){
			
			//判断_before_index存在否?
			if($class->hasMethod('_before_index')){
				
				//获取到_before_index方法对应的ReflectionMethod对象实例
				$before_method = $class->getMethod('_before_index');
				if($before_method->isPublic()){
					$before_method->invoke(new IndexAction);
				}
			}

			//调用自己的test方法
			$class->getMethod('test')->invoke(new IndexAction, '2019', '11', '11');

			
			if($class->hasMethod('_after_index')){
				//在判断后置方法是否可以调用
				$after_method = $class->getMethod('_after_index');
				if($after_method->isPublic()){
					$after_method->invoke(new IndexAction);
				}
			}


		}else{
			echo '<br>不存在index 你的控制器写错';
		}
	}else{
		echo '<br>不存在index方法';
	}